package com.xudm.cdg.api;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.xudm.cdg.entity.WxYiYanResult;
import com.xudm.cdg.entity.config.WxYiYanConfig;
import com.xudm.cdg.utils.HttpClientUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * 文心一言 API
 *
 * @author xudm
 */
@Component
@Slf4j
public class WxYiYanApi {
    private final HttpClientUtil clientUtil;
    private final WxYiYanConfig wxYiYanConfig;

    public WxYiYanApi(HttpClientUtil httpClientUtil, WxYiYanConfig wxYiYanConfig) {
        this.clientUtil = httpClientUtil;
        this.wxYiYanConfig = wxYiYanConfig;
    }

    /**
     * 获取 access_token
     *
     * @return access_token
     */
    public String getAccessToken() {
        // 通过 HttpClient 工具类发送请求获取 access_token
        String accessTokenUrl = wxYiYanConfig.getAccessTokenUrl();
        accessTokenUrl += "?grant_type=client_credentials&client_id=" + wxYiYanConfig.getApiKey() + "&client_secret=" + wxYiYanConfig.getSecretKey();
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        String responseStr = clientUtil.sendPostRequest(accessTokenUrl, "", headers);
        JSONObject jsonObject = JSONObject.parseObject(responseStr);
        if (jsonObject != null) {
            return jsonObject.getString("access_token");
        }
        return "";
    }


    /**
     * 聊天 ERNIE 4.8k 模型
     *
     * @param question 问题
     * @return 聊天结果
     */
    public WxYiYanResult chatByERNIE4_8k(String question) {
        // 通过 HttpClient 工具类发送请求获取聊天结果
        String chatUrl = wxYiYanConfig.getErnieUrl();
        chatUrl += "?access_token=" + "24.ec3580d89310f2526b4432e9869d4e82.2592000.1721023490.282335-82542764";
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        JSONObject body = new JSONObject();
        JSONArray messages = new JSONArray();
        JSONObject message = new JSONObject();
        /**
         * 聊天上下文信息。说明：
         * （1）messages成员不能为空，1个成员表示单轮对话，多个成员表示多轮对话，例如：
         * · 1个成员示例，"messages": [ {"role": "user","content": "你好"}]
         * · 3个成员示例，"messages": [ {"role": "user","content": "你好"},{"role":"assistant","content":"需要什么帮助"},{"role":"user","content":"自我介绍下"}]
         * （2）最后一个message为当前请求的信息，前面的message为历史对话信息
         * （3）成员数目必须为奇数，成员中message的role值说明如下：奇数位message的role值必须为user，偶数位message的role值为assistant。例如：
         * 示例中message中的role值分别为user、assistant、user、assistant、user；奇数位（红框）message中的role值为user，即第1、3、5个message中的role值为user；偶数位（蓝框）值为assistant，即第2、4个message中的role值为assistant
         * （4）message中的content总长度和system字段总内容不能超过20000个字符，且不能超过5120 tokens
         */
        if (StrUtil.isBlank(question)) {
            log.error("聊天问题不能为空");
            return null;
        }
        if (StrUtil.length(question) > 20000) {
            log.error("聊天问题长度超过20000个字符");
            return null;
        }
        message.put("role", "user");
        message.put("content", question);
        messages.add(message);
        body.put("messages", messages);
        body.put("system", "作为一个厉害的产品经理，你需要能够根据用户给出的提示，快速、准确地给出产品功能的概述。你的回复应体现出产品经理的专业性和对需求的深入理解，同时，回复内容需控制在300字以内，不要分小节回答，回答一段概述即可，也不要把我的提问作为标题返回来。");
        String responseStr = clientUtil.sendPostRequest(chatUrl, body.toJSONString(), headers);
        /**
         * 返回结果示例：
         * {
         *   "id": "as-qasge7vntb",
         *   "object": "chat.completion",
         *   "created": 1709716716,
         *   "result": "上海的美食种类繁多，其中包括一些著名的特色小吃。以下是一些具有代表性的上海美食：\n\n1. 生煎：生煎起源于元代，清朝时逐渐在上海开始流行，是用淀粉水制成的，当地人称为生煎馒头。\n2. 上海酱鸭：上海酱鸭突出了一个浓油赤酱的特点。其味悠远，脆中带嫩、辣中带麻、麻中带甜、甜而不腻。香味入骨，吃了就不会再忘记那股香味。\n3. 蟹壳黄：蟹壳黄又叫做小麻糕，作为上海的特色小吃之一，其馅包含了荠菜、白糖、葱油、豆沙四种小料。刚出炉时就像一个金黄的蟹壳，因此被称作蟹壳黄。吃上去香脆酥松、油多而不腻。\n4. 小笼包：上海人爱吃小笼包，热乎乎的，蒸的是上海的风味。上海人有时候把小笼包叫做小笼馒头。\n5. 白斩鸡：正宗的白斩鸡是使用三黄鸡制成的，因为在烹制过程中不加任何调味料只使用白水煮制，所以叫做白斩鸡。刚出锅的白斩鸡鸡皮金黄诱人，鸡肉白嫩紧致。稍稍变凉后蘸点酱油香醋吃，鸡皮爽脆、肥而不腻；鸡肉鲜嫩可口，咸甜适中，非常美味。\n6. 锅贴：锅贴绝对是上海人从小吃到大的经典早点。面皮裹着肉馅放油锅边煎上那么一会儿，底部焦硬，一口下去又脆又爽口。面皮绵软，还带点肉汁，直叫人欲罢不能。\n\n此外，排骨年糕、糟田螺、八宝饭等也是上海人非常喜欢的小吃，每个都有其独特的味道和制作工艺。这些美食不仅代表了上海的味道，也体现了上海的历史和文化。",
         *   "is_truncated": false,
         *   "need_clear_history": false,
         *   "finish_reason": "normal",
         *   "usage": {
         *     "prompt_tokens": 417,
         *     "completion_tokens": 365,
         *     "total_tokens": 782
         *   }
         * }
         */
        return JSONObject.parseObject(responseStr, WxYiYanResult.class);
    }

    public WxYiYanResult chatByErnie_lite_8k(String question) {
        String chatUrl = wxYiYanConfig.getErnieLite8kUrl();
        chatUrl += "?access_token=" + "24.ad83bd7a1afc007665b9d000a59599f4.2592000.1726020673.282335-82542764";
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Type", "application/json");
        JSONObject body = new JSONObject();
        JSONArray messages = new JSONArray();
        JSONObject message = new JSONObject();
        if (StrUtil.isBlank(question)) {
            log.error("聊天问题不能为空");
            return null;
        }
        if (StrUtil.length(question) > 20000) {
            log.error("聊天问题长度超过20000个字符");
            return null;
        }
        message.put("role", "user");
        message.put("content", question);
        messages.add(message);
        body.put("messages", messages);
        String responseStr = clientUtil.sendPostRequest(chatUrl, body.toJSONString(), headers);
        return JSONObject.parseObject(responseStr, WxYiYanResult.class);
    }

}
